---
title: Shell
description: 访问系统 shell，使用默认应用程序管理文件和 URL，并生成子进程。
plugin: shell
---

import PluginLinks from '@components/PluginLinks.astro';
import Compatibility from '@components/plugins/Compatibility.astro';

import { Steps, Tabs, TabItem } from '@astrojs/starlight/components';
import CommandTabs from '@components/CommandTabs.astro';

<PluginLinks plugin={frontmatter.plugin} />

访问系统 shell。允许您生成子进程并使用其默认应用程序管理文件和 URL。

## 支持的平台

<Compatibility plugin={frontmatter.plugin} />

## 设置

请安装 shell 插件。

<Tabs>
	<TabItem label="自动" >
		使用项目的包管理器来添加依赖。

    	{ ' ' }

    	<CommandTabs
    		npm="npm run tauri add shell"
    		yarn="yarn run tauri add shell"
    		pnpm="pnpm tauri add shell"
    		bun="bun tauri add shell"
    		cargo="cargo tauri add shell"
    	/>
    </TabItem>
    <TabItem label = "手动">
    	<Steps>
    	1. 在你的 `Cargo.toml` 文件中添加以下内容来安装 shell 插件。

    		```toml title="src-tauri/Cargo.toml"
    		[dependencies]
    		tauri-plugin-shell = "2.0.0"
    		# 或者使用 Git：
    		tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
    		```

    	2. 修改 `lib.rs` 来初始化插件。

    		```rust title="src-tauri/src/lib.rs" ins={3}
    		fn run() {
    				tauri::Builder::default()
    						.plugin(tauri_plugin_shell::init())
    						.run(tauri::generate_context!())
    						.expect("error while running tauri application");
    		}
    		```

    	3. 使用你喜欢的 JavaScript 包管理器安装 JavaScript Guest 绑定。

    		<CommandTabs
    			npm = "npm install @tauri-apps/plugin-shell"
    			yarn = "yarn add @tauri-apps/plugin-shell"
    			pnpm = "pnpm add @tauri-apps/plugin-shell"
    			bun="bun add @tauri-apps/plugin-shell"
    		/>
    	</Steps>
    </TabItem>

</Tabs>

## 用法

Shell 插件有 JavaScript 和 Rust 两种版本。

<Tabs>
	<TabItem label="JavaScript" >

```javascript
import { Command } from '@tauri-apps/plugin-shell';

let result = await Command.create('exec-sh', [
  '-c',
  "echo 'Hello World!'",
]).execute();
console.log(result);
```

    </TabItem>
    <TabItem label = "Rust" >

```rust
use tauri_plugin_shell::ShellExt;

let shell = app_handle.shell();
let output = tauri::async_runtime::block_on(async move {
		shell
				.command("echo")
				.args(["Hello from Rust!"])
				.output()
				.await
				.unwrap()
});
if output.status.success() {
		println!("Result: {:?}", String::from_utf8(output.stdout));
} else {
		println!("Exit with code: {}", output.status.code().unwrap());
}
```

    </TabItem>

</Tabs>

## 权限

默认情况下，所有插件命令都被阻止，无法访问。你必须在你的 `capabilities` 配置中定义一个权限列表。

更多信息请参见[访问控制列表](/zh-cn/reference/acl/)。

```json title="src-tauri/capabilities/default.json" ins={6-23}
{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "main-capability",
  "description": "Capability for the main window",
  "windows": ["main"],
  "permissions": [
    {
      "identifier": "shell:allow-execute",
      "allow": [
        {
          "name": "exec-sh",
          "cmd": "sh",
          "args": [
            "-c",
            {
              "validator": "\\S+"
            }
          ],
          "sidecar": false
        }
      ]
    }
  ]
}
```

| 权限                      | 描述                                                  |
| ------------------------- | ----------------------------------------------------- |
| `shell:allow-execute`     | 在没有预先配置的作用域的情况下启用 execute 命令。     |
| `shell:deny-execute`      | 拒绝没有任何预配置范围的 execute 命令。               |
| `shell:allow-kill`        | 在没有预先配置的作用域的情况下启用 kill 命令。        |
| `shell:deny-kill`         | 拒绝没有任何预配置范围的 kill 命令。                  |
| `shell:allow-open`        | 在没有预先配置的作用域的情况下启用 open 命令。        |
| `shell:deny-open`         | 拒绝没有任何预配置范围的 open 命令。                  |
| `shell:allow-stdin-write` | 在没有预先配置的作用域的情况下启用 stdin_write 命令。 |
| `shell:deny-stdin-write`  | 拒绝没有任何预配置范围的 stdin_write 命令。           |
